#include "StdAfx.h"
#include "Light.h"
#include <d3dx9.h>


///////////////////////////////////////////////////////////////////////////////

UINT CLight::s_nextAvailableNo = 0;

///////////////////////////////////////////////////////////////////////////////

CLight::CLight(IDirect3DDevice9& d3Device, D3DLIGHTTYPE lightType)
      : m_d3Device(d3Device),
      m_lightNo(s_nextAvailableNo++),
      m_enabled(false),
      m_dirty(true)
{
   m_lightDesc.Type = lightType;
   ZeroMemory(&(m_lightDesc.Ambient), sizeof(m_lightDesc.Ambient));
   ZeroMemory(&(m_lightDesc.Diffuse), sizeof(m_lightDesc.Diffuse));
   ZeroMemory(&(m_lightDesc.Specular), sizeof(m_lightDesc.Specular));
   ZeroMemory(&(m_lightDesc.Direction), sizeof(m_lightDesc.Direction));
   ZeroMemory(&(m_lightDesc.Position), sizeof(m_lightDesc.Position));
   m_lightDesc.Attenuation0 = 0;
   m_lightDesc.Attenuation1 = 0;
   m_lightDesc.Attenuation2 = 0;
   m_lightDesc.Range = 0;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::update()
{
   if (m_dirty == true)
   {
      m_d3Device.SetLight(m_lightNo, &m_lightDesc);
      m_dirty = false;
   }

   m_d3Device.LightEnable(m_lightNo, isEnabled());
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setAmbientColor(float r, float g, float b)
{
   m_lightDesc.Ambient.r = r;
   m_lightDesc.Ambient.g = g;
   m_lightDesc.Ambient.b = b;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setDiffuseColor(float r, float g, float b)
{
   m_lightDesc.Diffuse.r = r;
   m_lightDesc.Diffuse.g = g;
   m_lightDesc.Diffuse.b = b;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setSpecularColor(float r, float g, float b)
{
   m_lightDesc.Specular.r = r;
   m_lightDesc.Specular.g = g;
   m_lightDesc.Specular.b = b;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setDirection(const D3DXVECTOR3& vec)
{
   m_lightDesc.Direction = vec;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setPosition(const D3DXVECTOR3& vec)
{
   m_lightDesc.Position = vec;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setAttenuation(float constant, float linear, float quadratic)
{
   m_lightDesc.Attenuation0 = constant;
   m_lightDesc.Attenuation1 = linear;
   m_lightDesc.Attenuation2 = quadratic;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setRange(float range)
{
   m_lightDesc.Range = range;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////

void CLight::setSpotLightFeatures(float fallof, float theta, float phi)
{
   m_lightDesc.Falloff = fallof;
   m_lightDesc.Theta = theta;
   m_lightDesc.Phi = phi;
   m_dirty = true;
}

///////////////////////////////////////////////////////////////////////////////
